const express = require('express')
const session = require('express-session')
const path = require('path')
const config = require('config')

const { urlencoded } = require('body-parser')

const app = express()

// window
// global
console.log(process.env.NODE_ENV, 'NODE_ENV')
if (process.env.NODE_ENV === 'prod') {
  console.log('生产环境')
} else if (process.env.NODE_ENV === 'dev') {
  console.log('开发环境')
  app.use(require('morgan')('dev'))
}

console.log(config.get('db.url'), 'db.url')

require('./util/db')

require('./util/art-template').adapt(app)

app.use('/static', express.static(path.join(__dirname, 'public')))

// 这个express-session中间件，会做如下事情：
// 获取请求头cookie中的sessionId
//    如果携带了sessionId，就会搜索匹配的session
//      如果找到了，就赋值给req.session
//      如果找不到，就会创建一个session赋值给req.session
//    如果没有携带sessionId，也就会创建一个session赋值给req.session
// 最终在响应客户端前，会保存session，并加密sessionId，记录sessionId与session的映射关系，并将加密后的sessionId添加到响应头的cookie中
app.use(
  session({
    // 密钥，必填项，在加密sessionId时会用到，可以防止非法伪造cookie
    secret: 'itcast fe24 blog',
    // saveUninitialized：最终在响应客户端前，是否保存空session，默认值为true
    // 这里使用默认值true性能会好点，不然在保存session之前，该客户端每次请求服务端都会为之创建新的session
    saveUninitialized: true,
    // rolling：是否刷新cookie的有效时间，默认false
    rolling: true,
    cookie: {
      // 有效时间，如果不设置，默认是在关闭浏览器时，单位：毫秒
      maxAge: 30 * 60 * 1000
    }
  })
)

// 登录拦截  中间件拦截/admin开头的请求
// 注意（神坑）：如果加了一级路由，那么req.url是从二级路由开始的，也就是在访问，/admin/user/list时，  req.url 是从 /user/list 开始的
app.use('/admin', require('./middleware/login').middleware)
// app.use(require('./middleware/login').middleware)

// 设置app.locals下的全局数据
app.use(require('./middleware/locals-data').middleware)

app.use(urlencoded({ extended: false }))

app.use(require('./route/common').router)
app.use('/home', require('./route/home').router)
app.use('/admin', require('./route/admin').router)

// // 错误处理中间件
// 同步抛错：throw new Error()
// 异步抛错：next(new Error())
// 并不是只有我们手动抛出的错误会进入这里，程序在执行的过程中，一些第三方模块内部抛出的错误，也会被错误处理中间件铺捕获到
// app.use((err, req, res, next) => {
//   res.redirect(`${err.path}?${stringify(err.query)}`)
// })

app.listen(8080)
console.log('app start on http://localhost:8080/home')
